package com.infore.common.utils;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.beanutils.BeanUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 功能说明：字符串工具类
 * 
 * @ClassName: StringUtils
 * @author luo bin
 * @date 2016年9月29日 上午10:07:30
 * @最后修改人 luo bin
 * @最后修改时间 2016年9月29日 上午10:07:30
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils{
	/**
	 * 功能说明：AA_BB_CC转aaBbCc格式
	 * 
	  * @Title: getFieldString
	  * @author: luo bin
	  * @date 2016年9月29日 上午10:14:50
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年9月29日 上午10:14:50
	  * @param column
	  * @return
	  * @throws
	 */
	public static String getFieldString(String column) {
		StringBuilder sBuffer = new StringBuilder();
		String[] arr = column.toLowerCase().split("_");
		sBuffer.append(arr[0]);
		for (int i = 1; i < arr.length; i++) {
			String temp = arr[i].substring(0, 1).toUpperCase()
					+ arr[i].substring(1, arr[i].length());
			sBuffer.append(temp);
		}
		return sBuffer.toString();
	}
	
	/**
	 * 功能说明：对象是否为空
	 * 
	  * @Title: isEmpty
	  * @author: luo bin
	  * @date 2016年9月29日 上午10:16:20
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年9月29日 上午10:16:20
	  * @param obj
	  * @return 
	  * @throws
	 */
	public static boolean isEmpty(Object obj){
		if(null==obj||obj.toString().trim().length()==0){
			return true;
		}
		return false;
	}
	
	/**
	 * 功能说明：读取数据库配置文件resources.properties
	 * 
	  * @Title: redPropertiesDBFile
	  * @author: luo bin
	  * @date 2016年9月29日 上午10:19:57
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年9月29日 上午10:19:57
	  * @param key
	  * @return
	  * @throws
	 */
	public static String redPropertiesDBFile(String key){
		Properties prop = new Properties();
		InputStream in = StringUtils.class.getClassLoader().getResourceAsStream("hibernate.properties");
		try {
			prop.load(in);
			String value = prop.getProperty(key);
			return value;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(null != in){
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	
	/**
	 * 功能说明：读取配置文件config.properties
	 * 
	  * @Title: redPropertiesFile
	  * @author: luo bin
	  * @date 2016年9月29日 上午10:19:57
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年9月29日 上午10:19:57
	  * @param key
	  * @return
	  * @throws
	 */
	public static String redPropertiesFile(String key){
		Properties prop = new Properties();
		InputStream in = StringUtils.class.getClassLoader().getResourceAsStream("config.properties");
		try {
			prop.load(in);
			String value = prop.getProperty(key);
			return value;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(null != in){
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return null;
	}
	
	/**
	 * 功能说明：该对象是否为空
	 * 
	  * @Title: isNotEmpty
	  * @author: luo bin
	  * @date 2016年10月8日 下午4:02:47
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年10月8日 下午4:02:47
	  * @param obj
	  * @return
	  * @throws
	 */
	public static boolean isNotEmpty(Object obj){
		if(null!=obj&&obj.toString().length()>0){
			return true;
		}
		return false;
	}
	
	/**
	 * 功能说明：Object转Map
	 *  
	  * @Title: toMap
	  * @author: luo bin
	  * @date 2016年10月14日 上午9:51:08
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年10月14日 上午9:51:08
	  * @param object
	  * @return
	  * @throws IllegalAccessException
	  * @throws InvocationTargetException
	  * @throws NoSuchMethodException
	  * @throws
	 */
    @SuppressWarnings("unchecked")  
    public static Map<String, String> toMap(Object object) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        return BeanUtils.describe(object);
    }  
  
     /**
      * 功能说明：List<Object>转List<Map>
      *  
       * @Title: toMapList
       * @author: luo bin
       * @date 2016年10月14日 上午9:48:03
       * @最后修改人: luo bin
       * @最后修改时间：2016年10月14日 上午9:48:03
       * @param collection
       * @return
       * @throws IllegalAccessException
       * @throws InvocationTargetException
       * @throws NoSuchMethodException
       * @throws
      */
    public static <T> Collection<Map<String, String>> toMapList(Collection<T> collection) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {  
        List<Map<String, String>> retList = new ArrayList<Map<String, String>>();  
        if (collection != null && !collection.isEmpty()) {  
            for (Object object : collection) {  
                Map<String, String> map = toMap(object);  
                retList.add(map);  
            }  
        }  
        return retList;  
    }
    
   /**
    * 功能说明：返回json要转换的类型
    * 
     * @Title: getCollectionType
     * @author: luo bin
     * @date 2016年10月14日 下午1:42:40
     * @最后修改人: luo bin
     * @最后修改时间：2016年10月14日 下午1:42:40
     * @param collectionClass
     * @param elementClasses
     * @return
     * @throws
    */
	public static JavaType getCollectionType(Class<?> collectionClass,
			Class<?>... elementClasses) {
		ObjectMapper mapper = new ObjectMapper();
		return mapper.getTypeFactory().constructParametricType(collectionClass,
				elementClasses);
	}
	
	/**
	 * 功能说明：将json字符串转换成List<Mao>
	 * 
	  * @Title: jsonToListMap
	  * @author: luo bin
	  * @date 2016年10月14日 下午1:46:22
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年10月14日 下午1:46:22
	  * @param json
	  * @return
	  * @throws JsonParseException
	  * @throws JsonMappingException
	  * @throws IOException
	  * @throws
	 */
	public static List<Map<String,Object>> jsonToListMap(String json) throws JsonParseException, JsonMappingException, IOException{
		ObjectMapper mapper = new ObjectMapper();
		//接收指标参考值：json数组
		JavaType javaType = StringUtils.getCollectionType(ArrayList.class,
				Map.class);
		List<Map<String,Object>> list = (List<Map<String,Object>>) mapper.readValue(json, javaType);
		return list;
	}
	
	/**
	 * 功能说明：将数据库中List列表转换成json数据.
	 * 
	  * @Title: listToJson
	  * @author: luo bin
	  * @date 2016年12月16日 下午6:08:47
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年12月16日 下午6:08:47
	  * @param list
	  * @return
	  * @throws JsonProcessingException
	  * @throws
	 */
	public static String listToJson(List list) throws JsonProcessingException{
		ObjectMapper mapper = new ObjectMapper();  
		return mapper.writeValueAsString(list);
	}
	
	/**
	 * 功能说明：获取第一个对象
	 * 
	  * @Title: firstObj
	  * @author: luo bin
	  * @date 2016年10月14日 下午5:40:28
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年10月14日 下午5:40:28
	  * @param list
	  * @return
	  * @throws
	 */
	public static <T> T firstObj(List<T> list){
		if(null!=list&&list.size()>0){
			return list.get(0);
		}
		return null;
	}
	
	
	/**
	 * 功能说明：字符串转数字
	 * 
	  * @Title: stringToInt
	  * @author: luo bin
	  * @date 2016年11月10日 下午5:08:41
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年11月10日 下午5:08:41
	  * @param str
	  * @return
	  * @throws
	 */
	public static int stringToInt(String str){
		if(isNotEmpty(str)){
			String regex = "^[0-9]*$";
			Pattern pattern = Pattern.compile(regex);
			Matcher matcher = pattern.matcher(str);
			if(matcher.matches()){
				return Integer.parseInt(str);
			}
		}
		return -1;
	}
	
	/**
	 * 功能说明：字符串转double
	 * 
	  * @Title: stringToDouble
	  * @author: luo bin
	  * @date 2016年11月11日 下午2:31:07
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年11月11日 下午2:31:07
	  * @param str
	  * @return
	  * @throws
	 */
	public static Double stringToDouble(String str){
		if(isNotEmpty(str)){
			String regex = "^(([1-9][0-9]*)|((([1-9][0-9]*)|0)\\.[0-9]*))|0$";
			Pattern pattern = Pattern.compile(regex);
			Matcher matcher = pattern.matcher(str);
			if(matcher.matches()){
				return Double.parseDouble(str);
			}
		}
		return -999999.0;
	}
	
	/**
	 * 功能说明：BigDecimal转百分比
	 * 
	  * @Title: bigToBfb
	  * @author: luo bin
	  * @date 2016年12月2日 上午11:20:37
	  * @最后修改人: luo bin
	  * @最后修改时间：2016年12月2日 上午11:20:37
	  * @param value
	  * @return
	  * @throws
	 */
	public static String bigToBfb(BigDecimal value){
		if(null==value){
			return "0%";
		}
		NumberFormat percent = NumberFormat.getPercentInstance();
        percent.setMaximumFractionDigits(2);
        return percent.format(value.doubleValue());
	}
	
	public static String subZreo(String value){
		if(StringUtils.isEmpty(value)){
			return null;
		}
		value = value.replaceAll("0+?$", "");//去掉多余的0  
		return value;
	}
	
	/**
	 * 格式化流水号
	 * 
	 * @param format 格式化
	 * @param value 值
	 * @return
	 */
	public static String format(String format, int value){
		Date now = DateUtils.getNow();
		String yyyy = DateUtils.format(now, "yyyy");
		String yy = DateUtils.format(now, "yy");
		String mm = DateUtils.format(now, "MM");
		String dd = DateUtils.format(now, "dd");
		String code = format;
		code = code.replace("yyyy", yyyy);
		code = code.replace("yy", yy);
		code = code.replace("MM", mm);
		code = code.replace("dd", dd);
		code = String.format(code, value);
		return code;
	}
	/**
	 * 正则表达式，判断区划代码是否正确
	 * 1：省级，2：市级，3:区县级
	 * 
	 * @param value
	 * @returns {Number}
	 */
	public static int qhdm(String value){
		/**
		 * 区县级区划正则表达式
		 */
		String patternQhdm = "[0-9]{6}$";
		Pattern pattern = Pattern.compile(patternQhdm);
		Matcher matcher = pattern.matcher(value);
		/**
		 * 省级区划正则表达式
		 */
		String patternProvince="[0-9]{2}[0]{4}";
		Pattern pattern1 = Pattern.compile(patternProvince);
		Matcher matcher1 = pattern1.matcher(value);
		/**
		 * 市级区划正则表达式
		 */
		String patternCity="[0-9]{4}[0]{2}$";
		Pattern pattern2 = Pattern.compile(patternCity);
		Matcher matcher2 = pattern2.matcher(value);
		int i=0;
		if(matcher.matches()){
			i=3;
			if(matcher1.matches()){
				i=1;
			}else if(matcher2.matches()){
				i=2;
			}
		}
		return i;
	}
	
	public static String arrayToString(Object[] a) {
        if (a == null){
        	return "";
        }
        int iMax = a.length - 1;
        if (iMax == -1){
        	return "";
        }
        StringBuilder b = new StringBuilder();
        for (int i = 0;i<=iMax ; i++) {
            b.append(String.valueOf(a[i]));
            if (i != iMax){
            	b.append(",");
            }
        }
        return b.toString();
    }
	
	/**
	* @param regex
	* 正则表达式字符串
	* @param str
	* 要匹配的字符串
	* @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
	*/
	public static boolean match(String regex, String str) {
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		return matcher.matches();
	}

	/**
	 * @Description 获取主题配置
	 * @Author xiangyp
	 * @Date 2019/12/11
	 * @Param [key]
	 * @Return java.lang.String
	 **/
	public static String redPropertiesZtFile(String key){
		Properties prop = new Properties();
		InputStream in = StringUtils.class.getClassLoader().getResourceAsStream("zt_config.properties");
		BufferedReader bf = new BufferedReader(new InputStreamReader(in));
		try {
			prop.load(bf);
			String value = prop.getProperty(key);
			return value;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(null != in){
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return null;
	}

	/**
	 * 判断字符串中是否包含中文
	 * @param str
	 * 待校验字符串
	 * @return 是否为中文
	 * @warn 不能校验是否为中文标点符号
	 */
	public static boolean isContainChinese(String str) {
		Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
		Matcher m = p.matcher(str);
		if (m.find()) {
			return true;
		}
		return false;
	}
	
}
